// 引入axios
import axios from 'axios';
import { ElMessage } from 'element-plus'; // 引入Element Plus的消息组件

// 如果在其他电脑运行后端，则需要更改这里的IP地址
let baseUrl="http://127.0.0.1:8000/";
// 创建axios实例
const httpService = axios.create({
    baseURL:baseUrl,
    // 请求超时时间
    timeout: 3000 // 需自定义
});

//添加请求和响应拦截器
// 添加请求拦截器
httpService.interceptors.request.use(function (config) {
    // 从localStorage获取token（也可以使用sessionStorage）
    const token = localStorage.getItem('token');
    
    // 如果存在token，添加到请求头
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }
    
    return config;
}, function (error) {
    // 对请求错误做些什么
    ElMessage.error('请求配置错误');
    return Promise.reject(error);
});

// 添加响应拦截器
httpService.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
}, function (error) {
    // 对响应错误做点什么
    if (error.response) {
        // 服务器返回了错误状态码
        const status = error.response.status;
        const message = error.response.data?.message || error.response.data?.detail || error.response.data;
        
        switch (status) {
            case 400:
                ElMessage.error(message || '请求参数错误');
                break;
            case 401:
                ElMessage.error(message || '认证失败，请重新登录');
                // 可以在这里清除token
                localStorage.removeItem('token');
                sessionStorage.removeItem('token');
                break;
            case 403:
                ElMessage.error(message || '权限不足');
                break;
            case 404:
                ElMessage.error(message || '请求的资源不存在');
                break;
            case 500:
                ElMessage.error(message || '服务器内部错误');
                break;
            case 502:
                ElMessage.error('网关错误');
                break;
            case 503:
                ElMessage.error('服务不可用');
                break;
            case 504:
                ElMessage.error('网关超时');
                break;
            default:
                ElMessage.error(message || `请求失败 (${status})`);
        }
    } else if (error.request) {
        // 请求已发出但没有收到响应
        if (error.code === 'ECONNABORTED') {
            ElMessage.error('请求超时，请检查网络连接');
        } else {
            ElMessage.error('网络错误，请检查网络连接');
        }
    } else {
        // 其他错误
        ElMessage.error('请求发生错误');
    }
    
    return Promise.reject(error);
});

/*网络请求部分*/

/*
 *  get请求
 *  url:请求地址
 *  params:参数
 * */
export function get(url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'get',
            params: params
        }).then(response => {
            resolve(response);
        }).catch(error => {
            console.log(error)
            reject(error);
        });
    });
}

/*
 *  post请求
 *  url:请求地址
 *  params:参数
 * */
export function post(url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'post',
            data: params
        }).then(response => {
            console.log(response)
            resolve(response);
        }).catch(error => {
            console.log(error)
            reject(error);
        });
    });
}
/*
 *  put请求
 *  url:请求地址
 *  params:参数
 * */
export function put(url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'post',
            data: params
        }).then(response => {
            console.log(response)
            resolve(response);
        }).catch(error => {
            console.log(error)
            reject(error);
        });
    });
}
/*
 *  delete请求
 *  url:请求地址
 *  params:参数
 * */
export function del(url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'delete',
            data: params
        }).then(response => {
            console.log(response)
            resolve(response);
        }).catch(error => {
            console.log(error)
            reject(error);
        });
    });
}


/*
 *  文件上传
 *  url:请求地址
 *  params:参数
 * */
export function fileUpload(url, params = {}) {
    return new Promise((resolve, reject) => {
        httpService({
            url: url,
            method: 'post',
            data: params,
            headers: { 'Content-Type': 'multipart/form-data' }
        }).then(response => {
            resolve(response);
        }).catch(error => {
            reject(error);
        });
    });
}

export function getServerUrl(){
    return baseUrl;
}

// 添加token管理工具函数
export const tokenUtils = {
    setToken: (token, useSessionStorage = false) => {
        if (useSessionStorage) {
            sessionStorage.setItem('token', token);
        } else {
            localStorage.setItem('token', token);
        }
    },
    getToken: () => {
        return localStorage.getItem('token') || sessionStorage.getItem('token');
    },
    removeToken: () => {
        localStorage.removeItem('token');
        sessionStorage.removeItem('token');
    },
    hasToken: () => {
        return !!(localStorage.getItem('token') || sessionStorage.getItem('token'));
    }
};

export default {
    get,
    post,
    put,
    del,
    fileUpload,
    getServerUrl,
    tokenUtils
};












// // 引入axios
// import axios from 'axios';

// // 如果在其他电脑运行后端，则需要更改这里的IP地址
// let baseUrl="http://127.0.0.1:8000/";
// // 创建axios实例
// const httpService = axios.create({
//     // url前缀-'http:xxx.xxx'
//     // baseURL: process.env.BASE_API, // 需自定义
//     baseURL:baseUrl,
//     // 请求超时时间
//     timeout: 3000 // 需自定义
// });

// //添加请求和响应拦截器
// // 添加请求拦截器
// httpService.interceptors.request.use(function (config) {
//     // 在发送请求之前做些什么
//     // config.headers.AUTHORIZATION=window.sessionStorage.getItem('token');
//     return config;
// }, function (error) {
//     // 对请求错误做些什么
//     return Promise.reject(error);
// });

// // 添加响应拦截器
// httpService.interceptors.response.use(function (response) {
//     // 对响应数据做点什么
//     return response;
// }, function (error) {
//     // 对响应错误做点什么
//     return Promise.reject(error);
// });

// /*网络请求部分*/

// /*
//  *  get请求
//  *  url:请求地址
//  *  params:参数
//  * */
// export function get(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         httpService({
//             url: url,
//             method: 'get',
//             params: params
//         }).then(response => {
//             resolve(response);
//         }).catch(error => {
//             reject(error);
//         });
//     });
// }

// /*
//  *  post请求
//  *  url:请求地址
//  *  params:参数
//  * */
// export function post(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         httpService({
//             url: url,
//             method: 'post',
//             data: params
//         }).then(response => {
//             console.log(response)
//             resolve(response);
//         }).catch(error => {
//             console.log(error)
//             reject(error);
//         });
//     });
// }
// /*
//  *  put请求
//  *  url:请求地址
//  *  params:参数
//  * */
// export function put(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         httpService({
//             url: url,
//             method: 'post',
//             data: params
//         }).then(response => {
//             console.log(response)
//             resolve(response);
//         }).catch(error => {
//             console.log(error)
//             reject(error);
//         });
//     });
// }
// /*
//  *  delete请求
//  *  url:请求地址
//  *  params:参数
//  * */
// export function del(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         httpService({
//             url: url,
//             method: 'delete',
//             data: params
//         }).then(response => {
//             console.log(response)
//             resolve(response);
//         }).catch(error => {
//             console.log(error)
//             reject(error);
//         });
//     });
// }


// /*
//  *  文件上传
//  *  url:请求地址
//  *  params:参数
//  * */
// export function fileUpload(url, params = {}) {
//     return new Promise((resolve, reject) => {
//         httpService({
//             url: url,
//             method: 'post',
//             data: params,
//             headers: { 'Content-Type': 'multipart/form-data' }
//         }).then(response => {
//             resolve(response);
//         }).catch(error => {
//             reject(error);
//         });
//     });
// }

// export function getServerUrl(){
//     return baseUrl;
// }

// export default {
//     get,
//     post,
//     put,
//     del,
//     fileUpload,
//     getServerUrl
// }
